#include <iostream>
#include <vector>
using namespace std;

template<typename E>
void printVector(vector<E>& vector)
{
    for(E& ele : vector)
    {
        cout << ele << ", ";
    }
    cout << endl;
}

void test01()
{
    /* 1.无参构造 */
    vector<int> v;
    /* 2.添加元素 */
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    /* 3.迭代器：使用普通指针依次指向vector中的每一个元素 */
    //   begin():获取到的是vector容器中的首元素的地址
    //   end():获取到的是vector容器中的最后一位元素的下一位的指针
#if 0
    vector<int>::iterator it = v.begin();
    cout << *it << endl;
    it++;
    cout << *it << endl;
    it++;
    cout << *it << endl;
#else
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it << endl;
    }
#endif
    for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    {
        if(*it = 20)
        {
            *it = 200;
        }
    }
    /* 迭代器缩写 */
    /* 依次将v容器中的每一个元素给ele赋值 */
    for (int ele : v)//不是容器中的元素本身，无法修改其值
    {
        cout << ele << endl;
    }
    /* 可以通过引用进行修改 */
    for (int& ele : v)
    {
        cout << ele << endl;
    }

    /* 倒序遍历 */
#if 0
    for (vector<int>::iterator it = --v.end(); it != --v.begin(); it--)
    {
        cout << *it << endl;
    }
#else
    for (vector<int>::iterator it = v.end(); it != v.begin();)
    {   
        it--;
        cout << *it << endl;
    }
#endif
}

void test02()
{
    //1.无参构造函数
    vector<int> v1;

    //2. vector(n, ele);
    //  使用n个ele填充容器
    vector<int> v2(10, 5);
    printVector(v2);

    //3. vector(const vector& v), 拷贝构造函数

    //4. vector(v.begin(), v.end())
    vector<int> v3(v2.begin(), v2.end());
    printVector(v3);

    vector<int> v4(v2.begin(), v2.begin() + 5);
    printVector(v4);

    int array[] = {1,2,3,4,5};
    vector<int> v5(array, array + 3);
    printVector(v5);
}

void test03()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,0};

    //vector对象构建
    vector<int> v1;
    v1.assign(arr, arr + 6);
    printVector(v1);

    vector<int> v2;
    v2.assign(5, 10);
    printVector(v2);

    vector<int> v3;
    v3 = v2;
    printVector(v3);

    v1.swap(v2);
    printVector(v1);
    printVector(v2);
}

void test04()
{
    vector<int> v(10, 5);

    /* 返回容器中有多少个元素 */
    cout << "size = " << v.size() << endl;
    /* 判断容器是否为空 */
    cout << "isEmpty = " << v.empty() << endl;
    /* 返回容器的容量 */
    cout << "capacity = " << v.capacity() << endl;
    /* 重新指定容器的长度，如果新的长度小于原来的长度，保留容器中的前指定数量的元素，后面的元素不可见 */
    v.resize(5);
    /* 重新指定容器的长度，如果新的长度小于原来的长度，在后面填充默认元素 */
    //v.resize(15);
    /* 重新指定容器的长度，如果新的长度小于原来的长度，在后面填充指定元素 */
    v.resize(15, 9);
    cout << "size = " << v.size() << endl;
    printVector(v);
}

void test05()
{
    // at(int idx); 返回索引idx所指的数据，如果idx越界，抛出out_of_range异常。
    // operator[]; 返回索引idx所指的数据，越界时，运行直接报错
    // front(); 返回容器中第0个数据元素
    // back(); 返回容器中最后一个数据元素

    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    vector<int> v(array, array + (sizeof(array)) / sizeof(int));

    //
    int& ele = v.at(3);
    cout << ele << endl;
    ele = 40;
    printVector(v);
    ele = 40;
    printVector(v);

    int& e = v[5];
    cout << e << endl;
    e = 60;
    printVector(v);

    cout << v.front() << endl;
    cout << v.back() << endl;
}

void test06()
{
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    vector<int> v(array, array + (sizeof(array) / sizeof(int)));

    // insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个元素ele.
    // push_back(ele); //尾部插入元素ele
    // pop_back(); //删除最后一个元素
    // erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
    //clear(); // 删除容器中所有元素

    /* 在第3位插入元素 */
    v.insert(v.begin() + 3, 5, 0);
    printVector(v);

    v.push_back(20);
    printVector(v);

    v.pop_back();
    printVector(v);

    v.erase(v.begin() + 5);
    printVector(v);

    v.erase(v.begin(), v.begin() + 10);
    printVector(v);

    v.clear();
    printVector(v);
}  

/* 利用swap收缩空间 */
void test07()
{
    
}

int main()
{
    // test01();
    // test02();
    // test03();
    // test04();
    // test05();
    return 0;
}